/**
 * 
 */
package turbocoder;

/**
 * @author czarek
 *
 *	klasa dostarczajaca metody ro wypisywania tablic i do asercji
 *	pamietaj ze zawsze LSB jest po prawej stronie
 *	gdy wypisywana jest tablica to przed kazda komorka znajduje sie jej numer
 */
public class Utils {

	public static String toBitString(long l)
	{
		String strBitVal ="";
		for (int i =63; i>=0; i--)
		{	
			long bitVal =  (l & ((long)1) <<i);
			long longMin = -1L<<63;
			if( bitVal > 0 || bitVal==longMin)
			{
				strBitVal +="1";
			}
			else
				strBitVal +="0";
		}		
		return strBitVal;
	}

	public static void printBitString(long l)
	{
		System.out.println(toBitString(l));
	}

	public static String toBitString(byte l)
	{
		String strBitVal ="";
		for (byte i =7; i>=0; i--)
		{	
			byte bitVal =  (byte) (l & ((byte)1) << (byte) i);
			byte longMin = ((byte)-1)<<7;
			if( bitVal > 0 || bitVal==longMin)
			{
				strBitVal +="1";
			}
			else
				strBitVal +="0";
		}		
		return strBitVal;
	}

	public static void printBitString(byte l)
	{
		System.out.println(toBitString(l));
	}
	
	public static String longArrayToBitString(long[] longArray)

	{
		String strBitVal ="";
		for (int i =longArray.length -1; i >=0  ; i--)
		{
			strBitVal += " i:" + i+ " ";
			strBitVal += toBitString(longArray[i]);
			
		}
		return strBitVal;
	}

	public static void  printLongArrayToBitString(long[] longArray)
	{
		System.out.println(longArrayToBitString(longArray));
	}
	
	public static String byteArrayToBitString(byte[] byteArray)
	{
		String strBitVal ="";
		for (int i =byteArray.length -1; i >=0  ; i--)
		{
			strBitVal += "\t i:" + i+ " ";
			strBitVal += toBitString(byteArray[i]);
			
		}
		return strBitVal;
	}
	
	public static void printByteArrayToBitString(byte[] byteArray)
	{
		System.out.println(byteArrayToBitString(byteArray));
	}
	
	public static void assertArrayEqual(byte[] byteArray1, byte[] byteArray2)
	{
		
		assert(byteArray1.length == byteArray2.length);
		for (int i = 0; i< byteArray1.length; i++)
		{
			doAssert(byteArray1[i] == byteArray2[i]);
		}	
		//System.out.println("assertArrayEqual");
	}
	
	public static void assertArrayEqual(long[] byteArray1, long[] byteArray2)
	{
		assert(byteArray1.length == byteArray2.length);
		for (int i = 0; i< byteArray1.length; i++)
		{
			doAssert(byteArray1[i] == byteArray2[i]);
		}		
	}
	
	///zwykle assert nie chce mi dzialac, assert false; nie wywala wyjatku
	public static void doAssert(boolean val)
	{
		if(!val)
			throw new AssertionError();
	}
	
}

